package com.example.lotterysystem.service.impl;

import com.example.lotterysystem.common.errorcode.ServiceErrorCodeConstants;
import com.example.lotterysystem.common.exception.ServiceException;
import com.example.lotterysystem.common.utils.CaptchaUtil;
import com.example.lotterysystem.common.utils.MailUtil;
import com.example.lotterysystem.common.utils.RedisUtil;
import com.example.lotterysystem.common.utils.RegexUtil;
import com.example.lotterysystem.service.VerificationCodeService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

/**
 * Created with IntelliJ IDEA.
 * Description: 邮箱验证码服务
 * User: Li_Xiaochi
 * Date: 2025/8/3
 * Time: 13:43
 */
@Service
public class VerificationCodeServiceImpl implements VerificationCodeService {
    // 对于 redis 里面的 key 需要标准化: 为了区分业务，应该给 key 定义前缀:
    // VerificationCode_13111111111: 1234, User_13111111111: UserInfo
    // 邮箱验证码主题
    private static final String MAIL_SUBJECT = "【在线抽奖系统】 邮箱登录验证码";
    // 邮箱验证码内容前缀
    private static final String MAIL_CONTENT_PREFIX = "【在线抽奖系统】 验证码 ";
    // 邮箱验证码内容后缀
    private static final String MAIL_CONTENT_SUFFIX = " 用于在线抽奖系统用户邮箱登录，90s内有效，请勿泄露和转发。如非本人操作，请忽略此邮件";
    // 验证码前缀
    private static final String VERIFICATION_CODE_PREFIX = "VERIFICATION_CODE_";
    // 缓存时间
    private static final Long VERIFICATION_CODE_TIMEOUT = 60L;

    @Autowired
    private RedisUtil redisUtil;
    @Autowired
    private MailUtil mailUtil;


    @Override
    public void sendVerificationCode(String mailNumber) {
        // 校验邮箱号
        if (!RegexUtil.checkEmail(mailNumber)) {
            throw new ServiceException(ServiceErrorCodeConstants.MAIL_ERROR);
        }

        // 生成随机验证码
        String code = CaptchaUtil.getCaptcha(4);

        // 发送验证码
        mailUtil.sendSampleMail(mailNumber, MAIL_SUBJECT, MAIL_CONTENT_PREFIX + code + MAIL_CONTENT_SUFFIX);
        // 缓存验证码
        // 一个邮箱对应一个验证码
        redisUtil.set(VERIFICATION_CODE_PREFIX + mailNumber, code, VERIFICATION_CODE_TIMEOUT);
    }


    @Override
    public String getVerificationCode(String mailNumber) {
        // 校验手机号
        if (!RegexUtil.checkEmail(mailNumber)) {
            throw new ServiceException(ServiceErrorCodeConstants.MAIL_ERROR);
        }

        return redisUtil.get(VERIFICATION_CODE_PREFIX + mailNumber);
    }
}
